package com.zouxw.utils.json.utils;

/**
 * JSON解析异常类
 * 用于处理JSON解析过程中的各种错误
 * 
 * @author zouxw
 * @version 1.0
 */
public class JsonParseException extends Exception {
    
    private static final long serialVersionUID = 1L;
    
    /** 错误类型枚举 */
    public enum ErrorType {
        /** JSON格式错误 */
        FORMAT_ERROR,
        /** JSON结构错误 */
        STRUCTURE_ERROR,
        /** 编码错误 */
        ENCODING_ERROR,
        /** 文件读取错误 */
        FILE_READ_ERROR,
        /** 文件保存错误 */
        FILE_SAVE_ERROR,
        /** 未知错误 */
        UNKNOWN_ERROR
    }
    
    /** 错误类型 */
    private final ErrorType errorType;
    
    /** 错误位置（行号） */
    private final int lineNumber;
    
    /** 错误位置（列号） */
    private final int columnNumber;
    
    /**
     * 构造函数
     * 
     * @param message 错误消息
     */
    public JsonParseException(String message) {
        super(message);
        this.errorType = ErrorType.UNKNOWN_ERROR;
        this.lineNumber = -1;
        this.columnNumber = -1;
    }
    
    /**
     * 构造函数
     * 
     * @param message 错误消息
     * @param cause 原因异常
     */
    public JsonParseException(String message, Throwable cause) {
        super(message, cause);
        this.errorType = ErrorType.UNKNOWN_ERROR;
        this.lineNumber = -1;
        this.columnNumber = -1;
    }
    
    /**
     * 构造函数
     * 
     * @param message 错误消息
     * @param errorType 错误类型
     */
    public JsonParseException(String message, ErrorType errorType) {
        super(message);
        this.errorType = errorType;
        this.lineNumber = -1;
        this.columnNumber = -1;
    }
    
    /**
     * 构造函数
     * 
     * @param message 错误消息
     * @param errorType 错误类型
     * @param cause 原因异常
     */
    public JsonParseException(String message, ErrorType errorType, Throwable cause) {
        super(message, cause);
        this.errorType = errorType;
        this.lineNumber = -1;
        this.columnNumber = -1;
    }
    
    /**
     * 构造函数
     * 
     * @param message 错误消息
     * @param errorType 错误类型
     * @param lineNumber 行号
     * @param columnNumber 列号
     */
    public JsonParseException(String message, ErrorType errorType, int lineNumber, int columnNumber) {
        super(message);
        this.errorType = errorType;
        this.lineNumber = lineNumber;
        this.columnNumber = columnNumber;
    }
    
    /**
     * 获取错误类型
     * 
     * @return 错误类型
     */
    public ErrorType getErrorType() {
        return errorType;
    }
    
    /**
     * 获取行号
     * 
     * @return 行号，-1表示未知
     */
    public int getLineNumber() {
        return lineNumber;
    }
    
    /**
     * 获取列号
     * 
     * @return 列号，-1表示未知
     */
    public int getColumnNumber() {
        return columnNumber;
    }
    
    /**
     * 获取用户友好的错误消息
     * 
     * @return 用户友好的错误消息
     */
    public String getUserFriendlyMessage() {
        StringBuilder message = new StringBuilder();
        
        switch (errorType) {
            case FORMAT_ERROR:
                message.append("JSON格式错误：");
                break;
            case STRUCTURE_ERROR:
                message.append("JSON结构错误：");
                break;
            case ENCODING_ERROR:
                message.append("文件编码错误：");
                break;
            case FILE_READ_ERROR:
                message.append("文件读取错误：");
                break;
            case FILE_SAVE_ERROR:
                message.append("文件保存错误：");
                break;
            default:
                message.append("处理错误：");
                break;
        }
        
        message.append(getMessage());
        
        if (lineNumber > 0) {
            message.append(" (第").append(lineNumber).append("行");
            if (columnNumber > 0) {
                message.append("，第").append(columnNumber).append("列");
            }
            message.append(")");
        }
        
        return message.toString();
    }
    
    @Override
    public String toString() {
        return "JsonParseException{" +
                "errorType=" + errorType +
                ", lineNumber=" + lineNumber +
                ", columnNumber=" + columnNumber +
                ", message='" + getMessage() + '\'' +
                '}';
    }
}
